package prtpv;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public final class Configuracion {

    public static String CatalogoUbicacion;
    public static String CalculadoraUbicacion;
    public static int numItemsCatalogo;
    public static String polAplicable;
    public static List <HashMap<String,Float>> descuentos= new ArrayList<HashMap<String, Float>>();
    public static List <DctoProducto> productoDesc = new ArrayList <DctoProducto>();
    public static List <String> descNombres = new ArrayList ();;
    public static boolean aplicarDescProductos = false;


    private static HashMap<String, Float> DTarjetaFid;
    private static HashMap<String, Float> DEmpleado;
    private static HashMap<String, Float> DMiercoles;


    static int numDescuentos=0;
    public Configuracion() throws IOException {

    }

    public static void machinin(String archivo) throws IOException{

        leerArchivo(archivo);
    }

    public static void leerArchivo(String archivo) throws IOException {
        DTarjetaFid = new HashMap<String, Float>();
        DEmpleado = new HashMap<String, Float>();
        DMiercoles = new HashMap<String, Float>();

        String linea;
        int iaux;
        BufferedReader bf = new BufferedReader(new FileReader(archivo));
        while ((linea = bf.readLine()) != null) {

            if (!esComentario(linea)) {
                // campos de catalogo
                iaux = linea.indexOf('=');
                do{
                    iaux++;
                } while (linea.charAt(iaux)==' ');

                if (linea.startsWith("Catalogo")) {
                    if (linea.contains("URL")) {
                        CatalogoUbicacion = linea.substring(iaux);
                       
                    } else {
                        numItemsCatalogo = Integer.parseInt(linea.substring(iaux));
                    }
                } // campos de calculadora
                else if (linea.startsWith("Calculadora")) {
                    CalculadoraUbicacion = linea.substring(iaux);
                } // campo DescuentosAplicables
                else if (linea.startsWith("Descuentos")) {
                    polAplicable = linea.substring(iaux);
                } // informacion de descuentos
                else{
                    gestionarDescuentos(linea);
                }
            }
        }
        // En descuentos(0) hay un "indice" para determinar en qué
        // lugar del vector descuentos están los descuentos concretos
        descuentos.add(new HashMap<String, Float>());
        if (!DEmpleado.isEmpty())
        {


           descuentos.add(DEmpleado);
           descNombres.add("DctoEmpleado");
           descuentos.get(0).put("DctoEmpleado", (float) numDescuentos+1);
           numDescuentos++;

        }
        if (!DMiercoles.isEmpty())
        {

            descuentos.add(DMiercoles);
           descNombres.add("DctoMiercoles");
           descuentos.get(0).put("DctoMiercoles", (float) numDescuentos+1);
           numDescuentos++;


        }
        if (!DTarjetaFid.isEmpty())
        {
            descuentos.add(DTarjetaFid);
           descNombres.add("DctoTarjetaFid");
           descuentos.get(0).put("DctoTarjetaFid", (float) numDescuentos+1);
           numDescuentos++;


        }
    }

    public static void gestionarDescuentos(String linea) {
        String cadenaDesc, cadenaAtrib, valor;
        cadenaDesc = linea.substring(0, linea.indexOf('.'));
        cadenaAtrib = (linea.substring(linea.indexOf('.') + 1, linea.indexOf('='))).toLowerCase();
        valor = linea.substring(linea.indexOf('=') + 1);
        // en cadenas[0] almaceno la posicion de los descuentos

        if (cadenaDesc.equals("DctoEmpleado")) {
            DEmpleado.put(cadenaAtrib, Float.parseFloat(valor));
        } else if (cadenaDesc.equals("DctoMiercoles")) {
            DMiercoles.put(cadenaAtrib, Float.parseFloat(valor));
        } else if (cadenaDesc.equals("DctoTarjetaFid")) {
            DTarjetaFid.put(cadenaAtrib, Float.parseFloat(valor));
        } else if (cadenaDesc.equals("DctoProducto")) {
            productoDesc.add(new DctoProducto(Float.parseFloat(valor),cadenaAtrib));
            aplicarDescProductos = true;
        }

    }

    public static boolean esComentario(String linea) {
        return (linea.charAt(0) == '#');
    }

    public static String getCatalogoUbicacion()
    {
        return CatalogoUbicacion;
    }
    public static String getCalculadoraUbicacion()
    {
        return CalculadoraUbicacion;
    }
    public static int getNumItemsCatalogo()
    {
        return numItemsCatalogo;
    }
    public static String getPoliticaAplicable()
    {
        return polAplicable;
    }


    public static HashMap<String, Float> getDEmpleado()
    {
        return descuentos.get((int) (descuentos.get(0).get("DctoEmpleado")+0.1F));
    }
    public static HashMap<String, Float> getDTarjetaFid()
    {
        return descuentos.get((int) (descuentos.get(0).get("DctoTarjetaFid")+0.1F));
    }

    public static HashMap<String, Float> getDMiercoles()
    {
        return descuentos.get((int)(descuentos.get(0).get("DctoMiercoles")+0.1F));
    }
    public static List getDescNombres()
    {
        return descNombres;
    }
    public static int getNumDescuentos()
    {
        return numDescuentos;
    }

    public static boolean obtenPoliticaProducDesc()
    {
        return aplicarDescProductos;
    }

    public static Float obtenPorcentajeProducto (String ID)
    {
        Float num = -1F;
        for (int i=0;i<productoDesc.size();i++)
        {
            if (productoDesc.get(i).obtenerIDProd().equals(ID))
            {
                num =productoDesc.get(i).obtenerDescuento(null);
            }
        }

        return num;
    }


    public static String aString(){
        String retorno="";

        retorno+= "Impuestos: " +getCalculadoraUbicacion() +"\n";
        retorno+= "Catalogo: " + getCatalogoUbicacion() +"\n";
        retorno+= "Politica: " + getPoliticaAplicable() +"\n";
        retorno+= "DEmpleado: " + getDEmpleado()  +"\n" ;
        retorno+= "DMiercoles: " + getDMiercoles() + "\n";
        retorno+= "DTarjetaFid: " + getDTarjetaFid() +"\n";
        retorno+= "DescNombres: " + getDescNombres() +"\n";
        retorno+= "NumDescuentos: " + getNumDescuentos() +"\n";
        retorno+= "NumItemsCatalogo: " + getNumItemsCatalogo() +"\n";

        return retorno;
    }
}
